import EventBus from './event-bus'

const APP_READY_EVENT_NAME = "WX:AppReady"

/**
 * 事件总线
 */
const bus = new EventBus()
wx.$bus = bus
/**
 * 注册事件和处理函数
 * @param {string|Array} event - 事件名称或事件名称数组
 * @param {Function} fn - 处理函数
 */
wx.$on = function(event, fn) {
  bus.on(event, fn)
  if (event === APP_READY_EVENT_NAME && bus.appReay) {
    bus.emit(event, env.appInfo);
  }
}
/**
 * 注册事件和处理函数，触发一次后销毁
 * @param {string} event - 事件名称
 * @param {Function} fn - 处理函数
 */
wx.$once = function(event, fn) {
  bus.once(event, fn)
  if (event === APP_READY_EVENT_NAME && bus.appReay) {
    bus.emit(event, env.appInfo);
  }
}
/**
 * 销毁事件和处理函数
 * @param {string|Array} event - 事件名称或事件名称数组
 * @param {Function} [fn] - 处理函数
 */
wx.$off = function(event, fn) {
  bus.off(event, fn)
}
/**
 * 触发某事件所有回调并带参数
 * @param {string} event - 事件名称
 * @param {...*} args - 传递给回调函数的参数
 */
wx.$emit = function(event, ...args) {
  bus.emit.apply(bus, arguments);
  if (event === APP_READY_EVENT_NAME && !bus.appReay) {
    bus.appReay = true
  }
}

/**
 * 小程序准备好后回调
 * @param {Function} resolve 
 */
wx.onAppReady = function(resolve = () => {}) {
  wx.$once(APP_READY_EVENT_NAME, (data) => resolve(data))
}

wx.appReady = function() {
  wx.$emit.apply(bus, [APP_READY_EVENT_NAME, ...arguments])
}

export { bus }